Ringtone app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

89 line
2.7 KiB

  1. import {GetServerSideProps, NextPage} from 'next'
  2. import {getSession, Session, withPageAuthRequired} from '@auth0/nextjs-auth0';
  3. import {useEffect, useState} from 'react';
  4. import {models} from '@tonality/library-common'
  5. import {useRouter} from 'next/router';
  6. import CreateRingtoneTemplate from '../../../../components/templates/CreateRingtone'
  7. import RingtoneClient from '../../../../modules/ringtone/client'
  8. import WaveOscillator from '../../../../utils/sound/WaveOscillator'
  9. import SoundManager from '../../../../utils/sound/SoundManager'
  10. import ComposerClient from '../../../../modules/composer/client'
  11. type Props = {
  12. session: Partial<Session>,
  13. currentRingtone: models.Ringtone,
  14. }
  15. const Page: NextPage<Props> = ({
  16. session,
  17. currentRingtone,
  18. }) => {
  19. const [hydrated, setHydrated] = useState(false)
  20. const [ringtoneClient, setRingtoneClient] = useState<RingtoneClient>(null)
  21. const [composerClient, setComposerClient] = useState<ComposerClient>(null)
  22. const router = useRouter()
  23. useEffect(() => {
  24. setHydrated(true)
  25. }, [])
  26. useEffect(() => {
  27. setRingtoneClient(new RingtoneClient(process.env.NEXT_PUBLIC_API_BASE_URL, session))
  28. }, [hydrated])
  29. useEffect(() => {
  30. const audioContext = new AudioContext()
  31. const gainNode = audioContext.createGain()
  32. gainNode.gain.value = 0.05
  33. gainNode.connect(audioContext.destination)
  34. const oscillator = new WaveOscillator(audioContext, gainNode)
  35. const soundManager = new SoundManager(oscillator)
  36. setComposerClient(new ComposerClient(soundManager))
  37. }, [hydrated])
  38. return (
  39. <CreateRingtoneTemplate
  40. session={session}
  41. currentRingtone={currentRingtone}
  42. addNote={composerClient ? composerClient.addNote : undefined}
  43. addRest={composerClient ? composerClient.addRest : undefined}
  44. togglePlayback={composerClient ? composerClient.togglePlayback : undefined}
  45. updateSong={composerClient ? composerClient.updateSong : undefined}
  46. updateTempo={composerClient ? composerClient.updateTempo : undefined}
  47. updateView={composerClient ? composerClient.updateView : undefined}
  48. onSubmit={ringtoneClient ? ringtoneClient.save({ router }) : undefined}
  49. play={composerClient ? composerClient.play : undefined}
  50. />
  51. )
  52. }
  53. export const getServerSideProps: GetServerSideProps = withPageAuthRequired({
  54. getServerSideProps: async ({ req, res, params }) => {
  55. const { id } = params
  56. const { idToken, token_type, user } = getSession(req, res)
  57. const session = {
  58. idToken,
  59. token_type,
  60. user,
  61. }
  62. const client = new RingtoneClient(process.env.NEXT_PUBLIC_API_BASE_URL, session)
  63. const currentRingtone = await client.load({ id })
  64. if (!currentRingtone) {
  65. return {
  66. notFound: true,
  67. }
  68. }
  69. return {
  70. props: {
  71. session,
  72. currentRingtone,
  73. },
  74. }
  75. },
  76. returnTo: '/my/create/ringtones'
  77. })
  78. export default Page